package servlets;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import main.java.aplicacion.systemfactory.SystemFactory;
import main.java.aplicacion.usuarios.excepciones.UsuarioError;
import main.java.aplicacion.usuarios.interfaces.UsuariosMgt;
import main.java.datatypes.usuarios.ClienteVO;
import main.java.datatypes.usuarios.DesarrolladorVO;
import main.java.datatypes.usuarios.LoggedVO;
import main.java.datatypes.usuarios.UsuarioVO;
import main.java.seguridad.factory.loggedFactory;
import main.java.seguridad.interfaces.LogueadosMgt;

/**
 * Servlet implementation class Login
 */
public class Login extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession objSesion = request.getSession();
		LogueadosMgt log = loggedFactory.getInstance().getLogueadosMgt();
		
		if(request.getServletPath().equals("/login/login"))	
			request.getRequestDispatcher("/login/login.jsp").forward(request, response);
		
		else if(request.getServletPath().equals("/login/seleccionCat"))	{
			String categoria = request.getParameter("catseleccionada");
			objSesion.setAttribute("catSel", categoria);
			String nick = (String) objSesion.getAttribute("usuario");
			Boolean isDesa = (Boolean) objSesion.getAttribute("desarrollador");
			Integer juegoSel = (Integer) objSesion.getAttribute("juegoSeleccion");
			
			if(nick != null){
				if(isDesa.booleanValue())
					if(juegoSel.intValue() == 2)
						objSesion.setAttribute("juegos", log.listarJuegosDesarrollador(categoria, 0, nick, false));
					else
						objSesion.setAttribute("juegos", log.listarJuegosDesarrollador(categoria, 0, nick, true));
				else
					if(juegoSel.intValue() == 0)
						objSesion.setAttribute("juegos", log.listarJuegosVisitante(categoria, 0));
					else
						objSesion.setAttribute("juegos", log.listarJuegosCliente(categoria, 0, nick));
			}
			else	
				objSesion.setAttribute("juegos", log.listarJuegosVisitante(categoria, 0));
			
			request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
		}
		else if(request.getServletPath().equals("/login/clienteTodos"))	{
			String categoria = (String) objSesion.getAttribute("catSel");
			objSesion.setAttribute("juegoSeleccion", 0);
			objSesion.setAttribute("juegos", log.listarJuegosVisitante(categoria, 0));
			request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
		}
		else if(request.getServletPath().equals("/login/clienteCompras"))	{
			objSesion.setAttribute("juegoSeleccion", 1);
			String categoria = (String) objSesion.getAttribute("catSel");
			String nick = (String) objSesion.getAttribute("usuario");
			objSesion.setAttribute("juegos", log.listarJuegosCliente(categoria, 0, nick));
			request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
		}
		else if(request.getServletPath().equals("/login/desarrolladorPublicados"))	{
			objSesion.setAttribute("juegoSeleccion", 2);
			String categoria = (String) objSesion.getAttribute("catSel");
			String nick = (String) objSesion.getAttribute("usuario");
			objSesion.setAttribute("juegos", log.listarJuegosDesarrollador(categoria, 0, nick, false));
			request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
		}
		else if(request.getServletPath().equals("/login/desarrolladorAprobados"))	{
			objSesion.setAttribute("juegoSeleccion", 3);
			String categoria = (String) objSesion.getAttribute("catSel");
			String nick = (String) objSesion.getAttribute("usuario");
			objSesion.setAttribute("juegos", log.listarJuegosDesarrollador(categoria, 0, nick, true));
			request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
		}
		else {
			if(request.getServletPath().equals("/login/logout"))	{
			String nick = (String) objSesion.getAttribute("usuario");
			log.remove(nick);
			objSesion.removeAttribute("usuario");
			objSesion.removeAttribute("desarrollador");
			}
			
			
			
			String categoria = (String) objSesion.getAttribute("catSel");
			String nick = (String) objSesion.getAttribute("usuario");
			Boolean isDesa = (Boolean) objSesion.getAttribute("desarrollador");
			Integer juegoSel = (Integer) objSesion.getAttribute("juegoSeleccion");
			
			if(nick != null){
				if(isDesa.booleanValue())
					if(juegoSel.intValue() == 2)
						objSesion.setAttribute("juegos", log.listarJuegosDesarrollador(categoria, 0, nick, false));
					else
						objSesion.setAttribute("juegos", log.listarJuegosDesarrollador(categoria, 0, nick, true));
				else
					if(juegoSel.intValue() == 0)
						objSesion.setAttribute("juegos", log.listarJuegosVisitante(categoria, 0));
					else
						objSesion.setAttribute("juegos", log.listarJuegosCliente(categoria, 0, nick));
			}
			else	
				objSesion.setAttribute("juegos", log.listarJuegosVisitante(categoria, 0));
			
			request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
		
		}
	}

	@Override
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		HttpSession objSesion = request.getSession();
		if(request.getServletPath().equals("/login/login"))	{
		
			String action = request.getParameter("action");
			UsuariosMgt usrmgt = SystemFactory.getInstance().getUsuarioMgt();
	
			if ("Entrar".equals(action)) {
				String nick = request.getParameter("usuario");
				String pass = request.getParameter("pass");
	
				if (nick != null && !nick.isEmpty()) {
					if (pass != null && !pass.isEmpty()) {
						try {
							UsuarioVO usr = usrmgt.mostrarDatos(nick);
							if (usr.getContrasena().equals(pass)) {
								LogueadosMgt log = loggedFactory.getInstance().getLogueadosMgt();
								objSesion.setAttribute("usuario", nick);
								if (DesarrolladorVO.class.isInstance(usr)) {
									log.add(nick, LoggedVO.Tipo.Desarrollador);
									objSesion.setAttribute("visitante", false);
									objSesion.setAttribute("desarrollador",	Boolean.TRUE);
									objSesion.setAttribute("juegoSeleccion", 2);
									objSesion.setAttribute("catSel", "Todas");
									objSesion.setAttribute("juegos", log.listarJuegosDesarrollador("Todas", 0, nick, false));
								} else if (ClienteVO.class.isInstance(usr)) {
									log.add(nick, LoggedVO.Tipo.Cliente);
									objSesion.setAttribute("visitante", false);
									objSesion.setAttribute("desarrollador",	Boolean.FALSE);
									objSesion.setAttribute("juegoSeleccion", 0);
									objSesion.setAttribute("catSel", "Todas");
									objSesion.setAttribute("juegos", log.listarJuegosVisitante("Todas", 0));
								}
							} else {
								request.setAttribute("msgerror", "Contraseña incorrecta.");
							}
						} catch (UsuarioError e) {
							request.setAttribute("msgerror", "No existe usuario.");
						}
					} else {
						request.setAttribute("msgerror", "Error en la contraseña recibida.");
						}
				} else {
					request.setAttribute("msgerror", "Error en el nick de usuario recibido.");
					}
			
			} else if ("Cancelar".equals(action)) {
	
			}
	
		
		} 
		request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
			
	}
}